// 入口文件，会导出一个 reactive Api，传入一个对象，返回一个proxy对象
import handlers from "./handlers/index.js";
import { isObject } from "./utils.js";

// 创建一个WeakMap，用来存储代理对象和原始对象的映射关系
let proxyMap = new WeakMap();

/**
 * 实现一个响应式对象
 * @param {*} target
 * @returns 返回一个代理对象proxy
 */
export function reactive(target) {
  // 如果传入的是一个普通值，则直接返回
  if (!isObject(target)) {
    return target;
  }

  // 如果传入的是一个代理对象，则直接返回
  if (proxyMap.has(target)) {
    return proxyMap.get(target);
  }

  const proxy = new Proxy(target, handlers);

  // 将代理对象和原始对象存储到WeakMap中
  proxyMap.set(target, proxy);

  return proxy;
}
